package io.hilo.example.demo.config;

import org.hilo.boot.core.spring.ApplicationReadyListener;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import org.hilo.boot.core.spring.SpringRefreshedListener;
import io.hilo.example.demo.metric.CollectorService;
import io.hilo.example.demo.metric.PassCaseMetric;
import io.hilo.example.demo.metric.SummaryService;
import io.hilo.example.demo.metric.TimerService;

/**
 * 在spring bean 容器加载完成后做一些事情 
 * （执行顺序在<code>@PostConstruct</code>之后）
 * 
 * <p>spring和spring boot的生命周期很复杂，
 * ，为便于管理、减少误用，请统一使用下面的方法！！
 * 
 * <p>See {@link #onApplicationEvent}
 */
@Component
public class SpringContextRefreshedListener extends ApplicationReadyListener {

    /**
     * 统一在此注册，从上到下依次执行，
     * 所有class实现 RunAfterStart接口为同步执行
     * ，实现 AsyncRunAfterStart接口为异步执行，
     * 同步执行时若有未捕获异常，则本次启动失败，应用退出
     */
    @Override
    protected void doInit(ApplicationContext ctx) {
        // doInit(ctx, CheckConfig.class); // 检查配置项是否正确
//        doInit(ctx, CollectorService.class); // 示例
//        doInit(ctx, PassCaseMetric.class); // 示例
//        doInit(ctx, SummaryService.class); // 示例
//        doInit(ctx, TimerService.class); // 示例
    }

}
